package com.ruoyi.order.service.impl;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.order.domain.MesProductBarcode;
import com.ruoyi.order.enums.NodeResultStatusEnum;
import com.ruoyi.order.service.IMesProductBarcodeService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.order.mapper.MesProductNodeResultMapper;
import com.ruoyi.order.domain.MesProductNodeResult;
import com.ruoyi.order.service.IMesProductNodeResultService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 节点检测结果Service业务层处理
 *
 * @author guoxl
 * @date 2025-04-26
 */
@Service
public class MesProductNodeResultServiceImpl implements IMesProductNodeResultService {
    @Autowired
    private MesProductNodeResultMapper mesProductNodeResultMapper;

    @Autowired
    private IMesProductBarcodeService mesProductBarcodeService;

    /**
     * 查询节点检测结果
     *
     * @param id 节点检测结果主键
     * @return 节点检测结果
     */
    @Override
    public MesProductNodeResult selectMesProductNodeResultById(Long id) {
        return mesProductNodeResultMapper.selectMesProductNodeResultById(id);
    }

    /**
     * 查询节点检测结果
     *
     * @param param 节点检测结果
     * @return 节点检测结果
     */
    @Override
    public List<MesProductNodeResult> selectMesProductNodeResultByPartNumber(MesProductNodeResult param) {
        param.setStatus(NodeResultStatusEnum.VALID.getCode());
        return mesProductNodeResultMapper.selectMesProductNodeResultByPartNumber(param);
    }

    /**
     * 根据工位和料号的结果
     *
     * @param stationCode 工位
     * @param partNumber  料号
     * @return 结果
     */
    @Override
    public MesProductNodeResult getByStationCodeAndPartNumber(String stationCode, String partNumber) {
        MesProductNodeResult param = new MesProductNodeResult();
        param.setPartNumber(partNumber);
        param.setStationCode(stationCode);
        param.setStatus(NodeResultStatusEnum.VALID.getCode());
        List<MesProductNodeResult> list = mesProductNodeResultMapper.selectMesProductNodeResultList(param);
        if (CollectionUtils.isNotEmpty(list)){
            return list.get(0);
        }
        return null;
    }

    /**
     * 查询节点检测结果列表
     *
     * @param mesProductNodeResult 节点检测结果
     * @return 节点检测结果
     */
    @Override
    public List<MesProductNodeResult> selectMesProductNodeResultList(MesProductNodeResult mesProductNodeResult) {
        return mesProductNodeResultMapper.selectMesProductNodeResultList(mesProductNodeResult);
    }

    /**
     * 新增节点检测结果
     *
     * @param mesProductNodeResult 节点检测结果
     * @return 结果
     */
    @Override
    public int insertMesProductNodeResult(MesProductNodeResult mesProductNodeResult) {
        mesProductNodeResult.setCreateTime(DateUtils.getNowDate());
        return mesProductNodeResultMapper.insertMesProductNodeResult(mesProductNodeResult);
    }

    /**
     * 修改节点检测结果
     *
     * @param mesProductNodeResult 节点检测结果
     * @return 结果
     */
    @Override
    public int updateMesProductNodeResult(MesProductNodeResult mesProductNodeResult) {
        mesProductNodeResult.setUpdateTime(DateUtils.getNowDate());
        return mesProductNodeResultMapper.updateMesProductNodeResult(mesProductNodeResult);
    }

    /**
     * 批量删除节点检测结果
     *
     * @param ids 需要删除的节点检测结果主键
     * @return 结果
     */
    @Override
    public int deleteMesProductNodeResultByIds(Long[] ids) {
        return mesProductNodeResultMapper.deleteMesProductNodeResultByIds(ids);
    }


    /**
     * 批量删除节点检测结果和后续结果
     *
     * @param ids 需要删除的节点检测结果主键
     * @return 结果
     */
    @Override
    @Transactional
    public int deleteMesProductNodeFlowResultByIds(Long[] ids) {
        List<Long> barcodeIds = new ArrayList<>();
        for(Long id:ids){
            MesProductNodeResult mesProductNodeResult = mesProductNodeResultMapper.selectMesProductNodeResultById(id);
            MesProductNodeResult param = new MesProductNodeResult();
            param.setPartNumber(mesProductNodeResult.getPartNumber());
            param.setSubsysCode(mesProductNodeResult.getSubsysCode());
            param.setStatus(NodeResultStatusEnum.VALID.getCode());
            List<MesProductNodeResult> nodeResultList = this.selectMesProductNodeResultList(param);
            for (MesProductNodeResult nodeResult:nodeResultList){
                if (nodeResult.getSortIndex() >= mesProductNodeResult.getSortIndex()){
                    nodeResult.setStatus(NodeResultStatusEnum.INVALID.getCode());
                    nodeResult.setUpdateTime(DateUtils.getNowDate());
                    mesProductNodeResultMapper.updateMesProductNodeResult(nodeResult);
                    //获取NG站位已使用物料码
                    MesProductBarcode barcodeParam = new MesProductBarcode();
                    barcodeParam.setStationCode(nodeResult.getStationCode());
                    List<MesProductBarcode>  barcodeList = mesProductBarcodeService.selectMesProductBarcodeList(barcodeParam);
                    for (MesProductBarcode barcode:barcodeList){
                        if (barcode.getStatus().equals(NodeResultStatusEnum.VALID.getCode())){
                            barcodeIds.add(barcode.getBarcodeId());
                        }
                    }
                }
            }
        }
        if (CollectionUtils.isNotEmpty(barcodeIds)){
            mesProductBarcodeService.deleteMesProductBarcodeByBarcodeIds(barcodeIds.toArray(new Long[0]));
        }
        return 1;
    }

    /**
     * 删除节点检测结果信息
     *
     * @param id 节点检测结果主键
     * @return 结果
     */
    @Override
    public int deleteMesProductNodeResultById(Long id) {
        return mesProductNodeResultMapper.deleteMesProductNodeResultById(id);
    }
}
